#include "USART_RecvString.h"

// 接收缓冲区和状态变量
char recv_str[MAX_STR_LEN] = {0};
volatile uint8_t recv_idx = 0;        // 当前写入位置

// 中断函数（版本1 | 会按照字符串发走，通过测试）
void USART1_IRQHandler(void) {
    if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){
        char ch = USART_ReceiveData(USART1);
        if(recv_idx < MAX_STR_LEN-1) { // 防止溢出
            recv_str[recv_idx++] = ch;
            // 检测到回车换行则标记完成
            if(ch == '\r' || ch == '\n') {
                recv_str[recv_idx-1] = '\0'; // 替换终止符
                xQueueSendFromISR(xQueue, recv_str, NULL);
                recv_idx = 0; // 重置索引
            }
        }
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    }
}

//// 在中断中发送到队列（版本2 | 会按照逐字符发走，需要后续处理）
//void USART1_IRQHandler(void) {
//    BaseType_t xHigherPriorityTaskWoken = pdFALSE;
//    
//    if (USART_GetITStatus(USART1, USART_IT_RXNE)) {
//        uint8_t ch = USART_ReceiveData(USART1);
//        xQueueSendFromISR(xQueue, &ch, &xHigherPriorityTaskWoken);
//        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
//    }
//    
//    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
//}

/**
 * @brief  配置USART1外设的中断源, 以及初始化NVIC外设
 * @param  无
 * @retval 无
 * @note   
 */
void USART1_NVIC_Init(void){
	// 在USART初始化代码中开启中断和空闲中断
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  // 接收中断
	
	NVIC_EnableIRQ(USART1_IRQn);                    // 使能USART1全局中断
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); // 4位抢占优先级，无子优先级
    
	NVIC_InitTypeDef NVIC_InitStruct;
    NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 12;  // 抢占优先级
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;          // 子优先级
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
}

